/**
 * 画布工具函数模块
 * 
 * 提供与画布操作相关的通用工具函数，简化主组件中的重复逻辑
 */

/**
 * 检查画布是否已准备好
 * @returns {boolean} 画布是否已初始化
 */
export const isCanvasReady = () => {
  return typeof window !== 'undefined' && window.globalCanvas;
};

/**
 * 毫米转像素 (mm to px)
 * @param {number} mm - 毫米值
 * @param {number} pxPerMm - 每毫米对应的像素数
 * @returns {number} 对应的像素值
 */
export const mmToPx = (mm, pxPerMm) => {
  return mm * pxPerMm;
};

/**
 * 像素转毫米 (px to mm)
 * @param {number} px - 像素值
 * @param {number} pxPerMm - 每毫米对应的像素数
 * @returns {number} 对应的毫米值
 */
export const pxToMm = (px, pxPerMm) => {
  return px / pxPerMm;
};

/**
 * 计算并获取当前设备的DPI
 * @returns {number} 设备的DPI值
 */
export const getDeviceDpi = () => {
  if (typeof window === 'undefined') return 96; // 默认值
  
  // 创建临时元素测量DPI
  const div = document.createElement('div');
  div.style.width = '1in';
  div.style.height = '1in';
  div.style.position = 'absolute';
  div.style.left = '-100%';
  div.style.top = '-100%';
  document.body.appendChild(div);
  
  const dpi = div.offsetWidth;
  document.body.removeChild(div);
  
  return dpi;
};

/**
 * 计算像素与毫米的转换比例
 * @returns {number} 每毫米的像素数
 */
export const calculatePxPerMm = () => {
  const dpi = getDeviceDpi();
  // 1英寸 = 25.4毫米，dpi表示每英寸的像素数
  return dpi / 25.4;
};

/**
 * 清理DOM中的旧Canvas元素
 * @param {string} canvasId - Canvas元素的ID
 */
export const cleanupCanvas = (canvasId = 'designer-canvas') => {
  if (typeof window === 'undefined') return;
  
  const oldCanvas = document.getElementById(canvasId);
  if (oldCanvas) {
    console.log('清理旧的canvas元素');
    oldCanvas.parentNode.removeChild(oldCanvas);
  }
};

/**
 * 等待画布初始化完成
 * @param {number} timeout - 超时时间（毫秒）
 * @returns {Promise} 返回一个Promise，在画布初始化完成或超时后解析
 */
export const waitForCanvas = (timeout = 5000) => {
  return new Promise((resolve, reject) => {
    // 如果画布已经初始化，立即解析
    if (isCanvasReady()) {
      return resolve(window.globalCanvas);
    }
    
    // 设置最大尝试次数和间隔
    const maxTries = Math.floor(timeout / 100);
    let tries = 0;
    
    // 创建一个计时器函数来定期检查画布是否初始化
    const checkCanvas = () => {
      if (isCanvasReady()) {
        return resolve(window.globalCanvas);
      }
      
      tries++;
      if (tries >= maxTries) {
        return reject(new Error('等待画布初始化超时'));
      }
      
      setTimeout(checkCanvas, 100);
    };
    
    // 开始检查
    checkCanvas();
  });
};
